
/**
 *  作用: 自定义工具,方便操作
 *  作者: BloodSpider
 *  版本: v1.0.0
 *  更新时间: 2025/09/11
 *  创建时间: 2025/09/11
 * */


/**
 * 作用: 获取URL参数
 * @param url
 * @returns {{protocol: string, hostname: string, port: string, host: string, pathname: string, search: string, params: {}}}
 */
window.BloodSpiderFunction_getUrlParams =  function getUrlInfo(url) {
    // 如果未提供URL，则使用当前页面的URL
    const currentUrl = url || window.location.href;

    // 创建一个a标签来利用浏览器内置的URL解析能力
    const parser = document.createElement('a');
    parser.href = currentUrl;

    // 解析查询参数
    const params = {};
    if (parser.search) {
        // 移除问号并分割参数对
        const queryString = parser.search.slice(1);
        const paramPairs = queryString.split('&');

        paramPairs.forEach(pair => {
            // 分割键值对，处理没有值的参数
            const [key, value] = pair.split('=');

            if (key !== undefined && key !== '') {
                const decodedKey = decodeURIComponent(key);
                const decodedValue = value !== undefined ? decodeURIComponent(value) : '';

                // 处理重复参数，转换为数组
                if (params[decodedKey] !== undefined) {
                    if (!Array.isArray(params[decodedKey])) {
                        params[decodedKey] = [params[decodedKey]];
                    }
                    params[decodedKey].push(decodedValue);
                } else {
                    params[decodedKey] = decodedValue;
                }
            }
        });
    }

    // 返回完整的URL信息
    return {
        protocol: parser.protocol,       // 协议 (http: 或 https:)
        hostname: parser.hostname,       // 域名 (例如 example.com)
        port: parser.port || (parser.protocol === 'https:' ? '443' : '80'),  // 端口号，默认值基于协议
        host: parser.host,               // 域名+端口 (例如 example.com:8080)
        pathname: parser.pathname,       // 路径 (例如 /user/profile)
        search: parser.search,           // 带问号的查询字符串 (例如 ?id=1&name=test)
        params: params                   // 解析后的参数对象
    };
}

/**
 * Base64编码解码工具
 * @param {string} str - 要处理的字符串（编码时为普通字符串，解码时为Base64字符串）
 * @param {boolean} decode - 是否为解码操作，默认为false（编码）
 * @returns {string} 处理后的结果（编码后为Base64字符串，解码后为普通字符串）
 */
window.BloodSpiderFunction_base64Handler = function base64Handler(str, decode = false) {
    if (typeof str !== 'string') {
        throw new TypeError('输入必须是字符串类型');
    }

    try {
        if (decode) {
            // 解码操作：Base64字符串 -> UTF-8字符串
            // 先解码Base64，再将UTF-8字节转换为字符串
            return decodeURIComponent(
                atob(str)
                    .split('')
                    .map(char => '%' + ('00' + char.charCodeAt(0).toString(16)).slice(-2))
                    .join('')
            );
        } else {
            // 编码操作：UTF-8字符串 -> Base64字符串
            // 先将字符串转换为UTF-8字节，再进行Base64编码
            return btoa(
                encodeURIComponent(str)
                    .replace(/%([0-9A-F]{2})/g, (match, p1) =>
                        String.fromCharCode(parseInt(p1, 16))
                    )
            );
        }
    } catch (error) {
        throw new Error(`Base64处理失败: ${error.message}`);
    }
}



/**
 * 动态加载JavaScript链接
 * @param {string} url - 要加载的JavaScript文件URL
 * @param {Object} options - 加载选项
 * @param {Function} options.onLoad - 加载成功回调函数
 * @param {Function} options.onError - 加载失败回调函数
 * @param {boolean} options.async - 是否异步加载，默认为true
 * @param {boolean} options.defer - 是否延迟执行，默认为false
 * @returns {HTMLScriptElement} - 创建的script元素
 */
window.BloodSpiderFunction_loadScript = function loadScript(url, options = {}) {
  // 创建script元素
  const script = document.createElement('script');

  // 设置script属性
  script.src = url;
  script.type = 'text/javascript';
  script.async = options.async !== undefined ? options.async : true;
  script.defer = options.defer || false;

  // 处理加载成功
  script.onload = function() {
    if (typeof options.onLoad === 'function') {
      options.onLoad(url);
    }
  };

  // 处理加载失败
  script.onerror = function() {
    if (typeof options.onError === 'function') {
      options.onError(url);
    } else {
      console.error(`Failed to load script: ${url}`);
    }
  };

  // 添加到页面中（通常添加到head或body）
  const target = document.head || document.body;
  if (target) {
    target.appendChild(script);
  }

  return script;
}

